package tool.dialog;

import javax.swing.JFrame;
import javax.swing.JLabel;

import annotations.MainConstructor;

import tool.MainConstructorNotFoundException;
import tool.classloader.ClassNotSupportedException;

/**rappresenta una finestra di dialogo per costruire un nuovo oggetto in cui alcune textfield sono state appositamente
 * disabilitate. Questo può accadere se per caso si vuole che l'utente sappia che il nuovo oggetto da costruire necessita
 * di altri parametri da inserire ma comunque non si vuole che egli possa in alcun modo interferire con esso. In ogni caso,
 * per costruire effettivamente l'oggetto sarà necessario agire sull'array che <tt>getParameterlist</tt> ritorna. In particolare tutti
 * i parametri che sono stati esclusi saranno di tipo String e il loro valore sarà la stringa {@link #disabledFieldString}: ovviamente
 * tentare di costruire l'oggetto equivale ad ottenere degli errori di istanzializzazione; per questo, come già detto, serve una manipolazione
 * dell'array.
 * <p>La classe è dotata di un {@link #excludedParameters} che consiste in una lista di int; tale lista rappresenta le posizioni dei parametri
 * che devono essere esclusi, cioé non possono essere modificati dall'utente
 * 
 * @author koldar
 * @version 1.0
 *
 */
@Deprecated
public final class JExcludedParametersConstructorDialog extends JConstructorDialog{

	private static final long serialVersionUID = -6385307501853579121L;
	public static final String DISABLED_PARAMETER="Uneditable paramteres. It will be filled later.";
	
	/**indica la stringa che deve essere scritta all'interno del JTextField corrispondente al parametro richiesto per costruire l'oggetto
	 * escluso dalla {@link #excludedParameters}. Per default vale 
	 */
	protected String disabledFieldString;
	/**indica una serie di posizioni all'interno del <tt>MainConstrutor</tt> dei parametri che devono essere esclusi dalle modifiche
	 * dell'utente. 
	 */
	protected int[] excludedParameters;
	
	public JExcludedParametersConstructorDialog(JFrame parent,Class<?> _toconstruct,int ... excludedparameters) throws MainConstructorNotFoundException {
		super(parent,_toconstruct);
		//FIXME ci dovrebbe essere un controllo per verificare se l'array è nullo oppure no!
		this.excludedParameters=excludedparameters;
		this.disabledFieldString=DISABLED_PARAMETER;
	}


	/**popola la lista contenente i pannelli in cui scrivere i parametri di istanzializzazione. In caso in cui il tipo del parametro
	 * richiesto sia tra uno di quelli esclusi, il TextField corrispondente verrà disabilitato e la scritta di default verrà inserita
	 * come suo contenuto
	 * 
	 * @throws ClassNotSupportedException in caso in cui uno dei parametri non sia o un tipo primitivo oppure una Stringa.
	 * in questo caso tutti i pannelli inseriti verranno eliminati ({@link #parameterPanelList} assumer� size nulla)
	 */
	@Override
	protected void populateParameterPanelList() throws ClassNotSupportedException{
		MainConstructor annotation=this.getMainConstructor().getAnnotation(MainConstructor.class);
		Class<?>[] params=this.getMainConstructor().getParameterTypes();
		boolean toExclude=false;
		Class<?> param=null;
		for (int i=0;i<params.length;i++){
			for (int j=0;j<this.excludedParameters.length;j++){
				if (i==this.excludedParameters[j]){
					toExclude=true;
					break;
				}
			}
			if (toExclude){
				this.getParameterPanelList().add(new JParameterPanel(new JLabel(annotation.descriptions()[i]),new JStringField(this.disabledFieldString)));
				this.getParameterPanelList().lastElement().getTextfield().setEnabled(false);
				break;
			}
			param=params[i];
			if ((!param.isPrimitive())&&(!param.equals(String.class))){
				this.getParameterPanelList().removeAllElements();
				throw new ClassNotSupportedException(param);
			}
			this.getParameterPanelList().add(new JParameterPanel(new JLabel(annotation.descriptions()[i]),this.retrieveCorrectTextField(param)));
		}
	}


	/**
	 * @return the disabledaFieldString. For further information visit {@link #disabledFieldString}
	 */
	protected String getDisabledFieldString() {
		return disabledFieldString;
	}


	/**
	 * @param disabledFieldString the disabledFieldString to set
	 */
	protected void setDisabledFieldString(String disabledFieldString) {
		this.disabledFieldString = disabledFieldString;
	}
	
	
	

}
